#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>
//void ChildRun(){
//  int cnt =5;
//  while(cnt){
//   printf("I am child:%d,pid=%d,ppid=%d\n",cnt,getpid(),getppid());
//   cnt--;
//   sleep(1);
//  }
//}
//
//int main(){
//  int cnt =5;
//  while(cnt--){
//    pid_t id =fork();
//    if(id == 0){
//      ChildRun();
//      exit(0);
//    }
//  }
//  sleep(5);
//  int i=0;
//  for(i;i<cnt;i++){
//    pid_t ret = wait(NULL);
//    if(ret>0){
//      printf("wait success\n");
//    }
//  }
//  sleep(5);
//  return 0;
//}


//单个进程等待
int main()
{
  pid_t id =fork();
  if(id==0){
    int cnt=3;
   // int a=10;
    while(cnt){
     printf("I am child:%d,pid=%d,ppid=%d\n",cnt,getpid(),getppid());
     cnt--;
    // a=a/0;
    }
    exit(11);
  }
  //else if(id>0){
  //        
  //   int cnt=10;
  //   while(cnt){
  //   printf("I am father:%d,pid=%d,ppid=%d\n",cnt,getpid(),getppid());
  //   sleep(1);
  //   cnt--;
  //}
  //}
   //  else{
   //    perror("fork");
   //    return 1;
   //  }
     int status =0;
     //int ret=wait(NULL);
     while(1){
      int ret =waitpid(id,&status,WNOHANG); //status由32位组成，低7位用来判断进程是否异常结束，次低8位用来接收进程的退出码
     if(ret >0){
    //   printf("wait success pid=%d,sign state:%d,error state:%d\n",id,status&0x0F,(status>>8)&0xFF);
      if(WIFEXITED(status)){//为真则进程正常结束
      printf("wait %d success,exit code:%d\n",ret,WEXITSTATUS(status));//返回进程退出码
        break;
      }
      else{//进程异常结束

      printf("wait %d success,exit code:%d\n",ret,WTERMSIG(status));//返回进程信号编号
        break;
      }
     }
      else if(ret<0){

       printf("wait fail\n");
       break;
      }
     
     else{
      printf("你结束没，我再等等\n");
      sleep(1);
     }
     }
    // sleep(5);
}


